package cn.edu.qvtusx.utils;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.imageio.ImageIO;


public class QRCodeUtil {
    /**
     * 生成二维码并返回字节列表
     *
     * @param data      要编码的数据
     * @param charset   字符集（UTF-8）
     * @param format    图像格式（支持：jpg 或 png）
     * @return          返回二维码图像的字节列表
     */
    public static List<Byte> generateQRCode(String data, String charset, String format) {
        return generateQRCode(data, charset, format, 200, 200);
    }

    /**
     * 生成二维码并返回字节列表（UTF-8，jpg）
     *
     * @param data      要编码的数据
     * @return          返回二维码图像的字节列表
     */
    public static List<Byte> generateQRCode(String data) {
        return generateQRCode(data, "UTF-8", "jpg", 200, 200);
    }

    /**
     * 生成二维码并返回字节列表（UTF-8）
     *
     * @param data      要编码的数据
     * @param format    图像格式（支持：jpg 或 png）
     * @return          返回二维码图像的字节列表
     */
    public static List<Byte> generateQRCode(String data, String format) {
        return generateQRCode(data, "UTF-8", format, 200, 200);
    }

    /**
     * 生成二维码并返回字节列表
     *
     * @param data    要编码的数据
     * @param format  图像格式（支持：jpg 或 png）
     * @param width   二维码宽度
     * @param height  二维码高度
     * @return        返回二维码图像的字节列表
     */
    public static List<Byte> generateQRCode(String data, String format, int width, int height) {
        return generateQRCode(data, "UTF-8", format, width, height);
    }

    /**
     * 生成二维码并返回字节列表
     *
     * @param data    要编码的数据
     * @param charset 字符集（UTF-8）
     * @param format  图像格式（支持：jpg 或 png）
     * @param width   二维码宽度
     * @param height  二维码高度
     * @return        返回二维码图像的字节列表
     */
    public static List<Byte> generateQRCode(String data, String charset, String format, int width, int height) {
        try {
            // 验证格式是否合法
            if (!"jpg".equalsIgnoreCase(format) && !"png".equalsIgnoreCase(format)) {
                throw new IllegalArgumentException("只支持jpg或png格式");
            }

            // 配置二维码的错误纠正级别
            Map<EncodeHintType, ErrorCorrectionLevel> hints = new HashMap<>();
            hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);

            // 创建二维码写入器
            QRCodeWriter qrCodeWriter = new QRCodeWriter();
            BitMatrix bitMatrix = qrCodeWriter.encode(new String(data.getBytes(charset), charset),
                    BarcodeFormat.QR_CODE, width, height, hints);

            // 创建BufferedImage并填充二维码内容
            BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            for (int x = 0; x < width; x++) {
                for (int y = 0; y < height; y++) {
                    image.setRGB(x, y, bitMatrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF);
                }
            }

            // 将图像保存为指定格式的字节数组
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            ImageIO.write(image, format, byteArrayOutputStream);
            byte[] imageData = byteArrayOutputStream.toByteArray();

            // 将字节数组转换为字节列表
            List<Byte> resultList = new ArrayList<>();
            for (byte b : imageData) {
                resultList.add(b);
            }

            return resultList;
        } catch (WriterException | IOException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
            // 如果格式不合法，返回null
        }
        return null;
    }

}

